﻿#Использовать asserts

///////////////////////////////////////////////////////////////////////
// Тест класса ФиксированноеСоответствие
///////////////////////////////////////////////////////////////////////

Перем юТест;

////////////////////////////////////////////////////////////////////
// Программный интерфейс

Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
	
	юТест = ЮнитТестирование;
	
	ВсеТесты = Новый Массив;
	
	ВсеТесты.Добавить("ТестДолжен_СоздатьФиксированноеСоответствиеПоСоответствию");
	ВсеТесты.Добавить("ТестДолжен_СоздатьСоответствиеПоФиксированномуСоответствию");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьНеизменностьфиксированногоСоответствия");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоНельзяПоменятьЗначениеПриОбращенииЧерезКлюч");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьОтсутствиеМетодаВставить");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоНесуществующийКлючНельзяПрочитать");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСуществующийКлючНельзяИзменить");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПолучениеНесуществующегоКлючаНеВызываетОшибки");
	
	Возврат ВсеТесты;
КонецФункции

Процедура ТестДолжен_СоздатьФиксированноеСоответствиеПоСоответствию() Экспорт

	Соответствие = Новый Соответствие;
	Соответствие.Вставить("Ключ1", "Значение1");
	
	ФиксированноеСоответствие = Новый ФиксированноеСоответствие(Соответствие);
	
	Ожидаем.Что(ТипЗнч(ФиксированноеСоответствие)).Равно(Тип("ФиксированноеСоответствие"));
	Ожидаем.Что(ФиксированноеСоответствие.Количество(), "количество элементов исходной и полученной Соответствия совпадут").Равно(Соответствие.Количество());
	
КонецПроцедуры

Процедура ТестДолжен_СоздатьСоответствиеПоФиксированномуСоответствию() Экспорт

	Соответствие = Новый Соответствие;
	Соответствие.Вставить("Ключ1", "Значение1");
	
	ФиксированноеСоответствие = Новый ФиксированноеСоответствие(Соответствие);
	
	НовоеСоответствие = Новый Соответствие(ФиксированноеСоответствие);

	Ожидаем.Что(ТипЗнч(НовоеСоответствие)).Равно(Тип("Соответствие"));
	Ожидаем.Что(ФиксированноеСоответствие.Количество(), "количество элементов исходной и полученной Соответствия совпадут").Равно(НовоеСоответствие.Количество());
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьНеизменностьфиксированногоСоответствия() Экспорт

	Значение = "Значение1";
	Соответствие = Новый Соответствие;
	Соответствие.Вставить("Ключ1", Значение);
	
	ФиксированноеСоответствие = Новый ФиксированноеСоответствие(Соответствие);
	
	Ожидаем.Что(ФиксированноеСоответствие["Ключ1"], "ФиксированноеСоответствие[""Ключ1""] равно Соответствие[""Ключ1""]").Равно(Соответствие["Ключ1"]);

	Соответствие["Ключ1"] = Значение+1;
	Ожидаем.Что(ФиксированноеСоответствие["Ключ1"], "ФиксированноеСоответствие[""Ключ1""]/Значение1 не меняет своего значения после изменения Соответствие[""Ключ1""]/Значение").Равно(Значение);

	Значение = "Значение10";
	Ожидаем.Что(ФиксированноеСоответствие["Ключ1"], "ФиксированноеСоответствие[""Ключ1""]/Значение1 не меняет своего значения после изменения исходной переменной").Равно("Значение1");
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьОтсутствиеМетодаВставить() Экспорт

	Соответствие = Новый Соответствие;
	Соответствие.Вставить("Ключ1", "Значение1");
	
	ФиксированноеСоответствие = Новый ФиксированноеСоответствие(Соответствие);
	
	Попытка
		ФиксированноеСоответствие.Вставить("Ключ2", "Значение2");
	Исключение
		Ожидаем.Что(ФиксированноеСоответствие.Количество(), "количество элементов фиксированного Соответствия не меняется").Равно(1);
		Возврат;
	КонецПопытки;

	ВызватьИсключение "У класса ""ФиксированноеСоответствие"" не должно быть метода ""Вставить"", а он есть";	
КонецПроцедуры


Процедура ТестДолжен_ПроверитьЧтоНельзяПоменятьЗначениеПриОбращенииЧерезКлюч() Экспорт

	Значение = "Значение1";
	Соответствие = Новый Соответствие;
	Соответствие.Вставить("Ключ1", Значение);
	
	ФиксированноеСоответствие = Новый ФиксированноеСоответствие(Соответствие);
	
	Попытка
		ФиксированноеСоответствие["Ключ1"] = Значение+1;
	Исключение
		Ожидаем.Что(ФиксированноеСоответствие["Ключ1"], "ФиксированноеСоответствие[""Ключ1""]/Значение1 не меняет своего значения после изменения Соответствие[""Ключ1""]/Значение").Равно(Значение);
		Возврат;
	КонецПопытки;

	ВызватьИсключение "Ожидали, что у класса ""ФиксированноеСоответствие"" нельзя менять значение через обращение по ключу, а получили, что меняется";	
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоНесуществующийКлючНельзяПрочитать() Экспорт
	
	Значение = "Значение1";
	Соответствие = Новый Соответствие;
	Соответствие.Вставить("Ключ1", Значение);
	
	ФиксированноеСоответствие = Новый ФиксированноеСоответствие(Соответствие);
	
	Попытка
		А = ФиксированноеСоответствие["Ключ2"];
	Исключение
		Если Не ИнформацияОбОшибке().Описание = "Значение, соответствующее ключу, не задано" Тогда
			ВызватьИсключение;
		КонецЕсли;
		Возврат;
	КонецПопытки;
	
	ВызватьИсключение "Чтение несуществующего ключа было выполнено";
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоСуществующийКлючНельзяИзменить() Экспорт

	Значение = "Значение1";
	Соответствие = Новый Соответствие;
	Соответствие.Вставить("Ключ1", Значение);
	
	ФиксированноеСоответствие = Новый ФиксированноеСоответствие(Соответствие);
	
	Попытка
		ФиксированноеСоответствие["Ключ1"] = 5;
	Исключение
		Ожидаем.Что(ФиксированноеСоответствие["Ключ1"], "не изменился элемент соответствия").Равно(Значение);
		Если Не ИнформацияОбОшибке().Описание = "Индексированное значение доступно только для чтения" Тогда
			ВызватьИсключение;
		КонецЕсли;
	КонецПопытки;

КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоПолучениеНесуществующегоКлючаНеВызываетОшибки() Экспорт

	Соответствие = Новый Соответствие;
	ФиксированноеСоответствие = Новый ФиксированноеСоответствие(Соответствие);
	
	Значение = ФиксированноеСоответствие.Получить("Заведомо отсутствующий ключ");
	юТест.ПроверитьРавенство(Значение, Неопределено, "Отсутствующий ключ вернул не Неопределено");

КонецПроцедуры
